﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Utiles.Persistencia;

namespace EntidadesDeNegocio
{
    public abstract class Componente:ObjetoPersistente
    {
       
        /// <summary>
        //TODO: Agregar a Clase de Constantes?
        /// </summary>
        private const int CantidadMesesFechaService = 6;
        /// <summary>
        /// Modelo del componente
        /// </summary>
        public string Modelo { set; get; }
        /// <summary>
        /// Numero de serie del componente
        /// </summary>
        public string NumeroSerie { set; get; }
        /// <summary>
        /// Medio del componente
        /// </summary>
        public MedioComponente Medio { get; set; }
        /// <summary>
        /// Costo del componente
        /// </summary>
        public decimal Costo { get; set; }
        /// <summary>
        /// Fecha de service del componente
        /// </summary>
        public DateTime FechaService { get; set; }
        /// <summary>
        /// Descripcion del componente
        /// </summary>
        public string Descripcion { get; set; }
        /// <summary>
        /// Fecha de creacion del componente
        /// </summary>
        public DateTime FechaCreacion { get; set; }
        /// <summary>
        /// Cantidad del componente en stock
        /// </summary>
        public int Cantidad { get; set; }
        /// <summary>
        /// Constructor sin parametros
        /// </summary>
        public Componente() { }
        /// <summary>
        /// Constructor con parametos de componente
        /// </summary>
        /// <param name="modelo"></param>
        /// <param name="numeroSerie"></param>
        /// <param name="medio"></param>
        /// <param name="costo"></param>
        /// <param name="descripcion"></param>
        /// <param name="fechaCreacion"></param>
        /// <param name="cantidad"></param>
        public Componente(string modelo, string numeroSerie, MedioComponente medio, decimal costo, string descripcion, DateTime fechaCreacion, int cantidad,DateTime fechaService) 
        {
            this.Modelo = modelo;
            this.NumeroSerie = numeroSerie;
            this.Medio = medio;
            this.Costo = costo;
            this.Descripcion = descripcion;
            this.FechaCreacion = fechaCreacion;
            this.Cantidad = cantidad;
            this.FechaService = fechaService;
        }        
        /// <summary>
        /// Devuelve el tipo del componente
        /// </summary>
        /// <returns></returns>
        public abstract TipoComponente GetTipo();
        /// <summary>
        /// Agrega el componente a la lista de componentes
        /// </summary>
        /// <param name="componente"></param>
        public abstract  void AgregarComponente(Componente componente);
        /// <summary>
        /// Eliminar el componente de la lista de componentes
        /// </summary>
        /// <param name="componente"></param>
        public abstract void ElimnarComponente(Componente componente);
        /// <summary>
        /// Se redefine el metodo equals
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            bool valor;
            try
            {
                valor = this.Modelo == ((Componente)obj).Modelo;
                return valor;
            }
            catch
            {
                return base.Equals(obj);
            }
        }
        /// <summary>
        /// Se redefine hashcode
        /// </summary>
        /// <returns></returns>
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        /// <summary>
        /// Muestra el (modelo - numeroserie)
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return this.Modelo + " - " + this.NumeroSerie;
        }        
        /// <summary>
        /// Clona el componente
        /// </summary>
        /// <returns></returns>
        public abstract Componente Clone();
        /// <summary>
        /// Obtiene un componente del arbol de componentes
        /// </summary>
        /// <param name="modelo"></param>
        /// <returns></returns>
        public abstract Componente ObtenerComponente(string modelo);
        /// <summary>
        /// Acepta un visitor
        /// </summary>
        /// <param name="visitor"></param>
        public abstract void AceptarVisitor(IVisitor visitor);

        /// <summary>
        /// Si el existe un componente en el Diseno que necesita que se le realice un service a la fecha de hoy.
        /// </summary>
        /// <returns></returns>
        public bool NecesitaService()
        {
            return this.FechaService < DateTime.Now;
        }

        /// <summary>
        /// Realizar el service del componente sumando 6 meses a la fecha de hoy
        /// </summary>
        public void RealizarService()
        {
            this.FechaService = DateTime.Now.AddMonths(CantidadMesesFechaService);
        }
        
    }
}
